import fetch from 'isomorphic-fetch'
import Cookies from 'js-cookie'

/**
 * 生成Fetch配置对象，以便我们可以共享标头
 * @method generateFetchConfig
 * @param  {string}            method      HTTP 请求方法
 * @param  {object}            [body=null] data 对象，POST/PUT 请求下添加
 * @return {object}                        config
 */
function generateFetchConfig(method, body = null) {
  const upCasedMethod = method.toUpperCase();
  const token = Cookies.get('letters-token');
  const config = {
    method: upCasedMethod,
    headers: {
      'Content-Type': 'application/json',
      'Letters-Token': token
    },
    credentials: 'same-origin'
  };
  if (['POST', 'PUT'].includes(upCasedMethod)) {
    config.body = JSON.stringify(body);
  }
  return config;
}

/**
 * 创建一篇文章
 * @method createPost
 * @param  {object}   payload 文章必须data对象
 * @return {Response}           Fetch（Promise）
 */
export function createPost(payload) {
  // Send the new post to the API
  return fetch(`${process.env.REACT_APP_SERVE_API}/posts`, generateFetchConfig('POST', payload));
}

/**
 * API获取帖子
 * @method fetchPosts
 * @param  {string}   endpoint 请求URL，配置默认
 * @return {Response}          Fetch（Promise）
 */
export function fetchPosts(endpoint) {
  return fetch(endpoint);
}

/**
 * Fetch GET请求，根据 文章ID 获取一篇文章
 * @method fetchPost
 * @param  {string}  id 文章ID
 * @return {Response}     Fetch（Promise）
 */
export function fetchPost(id) {
  return fetch(
      `${process.env.REACT_APP_SERVE_API}/posts/${id}?_embed=comments&_expand=user&_embed=likes`,
      generateFetchConfig('GET')
  );
}

/**
 * Fetch Get请求，根据文章id获取 该文章下的所有评论
 * @method 获取评论发表
 * @param  {string}  postId 文章ID
 * @return {Response}  Fetch（Promise）
 */
export function fetchCommentsForPost(postId) {
  return fetch(
      `${process.env.REACT_APP_SERVE_API}/comments?postId=${postId}&_expand=user`,
      generateFetchConfig('GET')
  );
}

/**
 * Fetch Post请求创建评论
 * @method 创建评论
 * @param  {object}   评论data对象
 * @return {Response}           Fetch（Promise）
 */
export function createComment(payload) {
  // 将新帖子发送到API
  return fetch(`${process.env.REACT_APP_SERVE_API}/comments`, generateFetchConfig('POST', payload));
}

/**
 * PUT请求创建点赞
 * @method 创建点赞
 * @param  {string} postId 文章ID
 * @param  {string} userId 用户ID
 * @return {Response}        Fetch（Promise）
 */
export function likePost(postId, userId) {
  // 为用户/帖子创建一个新的赞
  return fetch(
      `${process.env.REACT_APP_SERVE_API}/posts/${postId}/likes/${userId}`,
      generateFetchConfig('PUT', { postId, userId })
  );
}

/**
 * DELETE请求删除点赞
 * @method 取消点赞
 * @param  {string}   postId 文章ID
 * @param  {string}   userId 用户ID
 * @return {Response} Fetch（Promise）
 */
export function unlikePost(postId, userId) {
  return fetch(
      `${process.env.REACT_APP_SERVE_API}/posts/${postId}/likes/${userId}`,
      generateFetchConfig('DELETE')
  );
}

/**
 * Fetch GET请求，根据 id 获取用户
 * @method 获取用户
 * @param  {string}  id 用户ID
 * @return {Response}     Fetch（Promise）
 */
export function loadUser(id) {
  return fetch(`${process.env.REACT_APP_SERVE_API}/users/${id}`, generateFetchConfig('GET'));
}

/**
 * Fetch POST请求，创建用户
 * @method 创建用户
 * @param  {object}  payload 用户data对象
 * @return {Response}     Fetch（Promise）
 */
export function createUser(payload) {
  return fetch(`${process.env.REACT_APP_SERVE_API}/users`, generateFetchConfig('POST', payload));
}
